{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 10 -  Cost-Sensitive Classification\n",
    "\n",
    "by [Alejandro Correa Bahnsen](http://www.albahnsen.com/) & [Iván Torroledo](http://www.ivantorroledo.com/)\n",
    "\n",
    "version 1.2, Feb 2018\n",
    "\n",
    "## Part of the class [Machine Learning for Risk Management](https://github.com/albahnsen/ML_RiskManagement)\n",
    "\n",
    "This notebook is licensed under a [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div>\n",
    "<img img class=\"logo\" src=\"https://raw.githubusercontent.com/albahnsen/CostSensitiveClassification/master/logo.png\" style=\"width: 300px;\" align=\"right\">\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Install costcla\n",
    "\n",
    "```\n",
    "pip install costcla\n",
    "```\n",
    "\n",
    "see https://github.com/albahnsen/CostSensitiveClassification"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "  ## Credit Scoring\n",
    "  \n",
    "  In order to mitigate the impact of credit risk and make more objective and accurate decisions, \n",
    "  financial institutions use credit scores to predict and control their losses.\n",
    "  The objective in credit scoring is to classify which potential customers are likely to default a \n",
    "  contracted financial obligation based on the customer's past financial experience, and with that \n",
    "  information decide whether to approve or decline a loan [1]. This tool has \n",
    "  become a standard practice among financial institutions around the world in order to predict \n",
    "  and control their loans portfolios. When constructing credit scores, it is a common practice to \n",
    "  use standard cost-insensitive binary classification algorithms such as logistic regression, \n",
    "  neural networks, discriminant analysis, genetic programing, decision trees, among \n",
    "  others [2,3]. \n",
    "  \n",
    "  Formally, a credit score is a statistical model that allows the estimation of the probability \n",
    "  $\\hat p_i=P(y_i=1|\\mathbf{x}_i)$ of a customer $i$ defaulting a contracted debt. Additionally, \n",
    "since the objective of credit scoring is to estimate a classifier $c_i$ to decide whether or not to grant a \n",
    "loan to a customer $i$, a threshold $t$ is defined such that if $\\hat p_i < t $, then the loan is \n",
    "  granted, i.e., $c_i(t)=0$, and denied otherwise, i.e., $c_i(t)=1$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example: Kaggle Credit Competition\n",
    "\n",
    "Improve on the state of the art in credit scoring by predicting the probability that somebody will experience financial distress in the next two years.\n",
    "\n",
    "https://www.kaggle.com/c/GiveMeSomeCredit\n",
    "\n",
    "### Load dataset and show basic statistics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['data', 'target', 'cost_mat', 'target_names', 'DESCR', 'feature_names', 'name'])\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from costcla.datasets import load_creditscoring1\n",
    "data = load_creditscoring1()\n",
    "\n",
    "# Elements of the data file\n",
    "print(data.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>RevolvingUtilizationOfUnsecuredLines</th>\n",
       "      <th>age</th>\n",
       "      <th>NumberOfTime30-59DaysPastDueNotWorse</th>\n",
       "      <th>DebtRatio</th>\n",
       "      <th>MonthlyIncome</th>\n",
       "      <th>NumberOfOpenCreditLinesAndLoans</th>\n",
       "      <th>NumberOfTimes90DaysLate</th>\n",
       "      <th>NumberRealEstateLoansOrLines</th>\n",
       "      <th>NumberOfTime60-89DaysPastDueNotWorse</th>\n",
       "      <th>NumberOfDependents</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.766127</td>\n",
       "      <td>45.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.802982</td>\n",
       "      <td>9120.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.957151</td>\n",
       "      <td>40.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.121876</td>\n",
       "      <td>2600.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.658180</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.085113</td>\n",
       "      <td>3042.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.233810</td>\n",
       "      <td>30.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.036050</td>\n",
       "      <td>3300.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.907239</td>\n",
       "      <td>49.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.024926</td>\n",
       "      <td>63588.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   RevolvingUtilizationOfUnsecuredLines   age  \\\n",
       "0                              0.766127  45.0   \n",
       "1                              0.957151  40.0   \n",
       "2                              0.658180  38.0   \n",
       "3                              0.233810  30.0   \n",
       "4                              0.907239  49.0   \n",
       "\n",
       "   NumberOfTime30-59DaysPastDueNotWorse  DebtRatio  MonthlyIncome  \\\n",
       "0                                   2.0   0.802982         9120.0   \n",
       "1                                   0.0   0.121876         2600.0   \n",
       "2                                   1.0   0.085113         3042.0   \n",
       "3                                   0.0   0.036050         3300.0   \n",
       "4                                   1.0   0.024926        63588.0   \n",
       "\n",
       "   NumberOfOpenCreditLinesAndLoans  NumberOfTimes90DaysLate  \\\n",
       "0                             13.0                      0.0   \n",
       "1                              4.0                      0.0   \n",
       "2                              2.0                      1.0   \n",
       "3                              5.0                      0.0   \n",
       "4                              7.0                      0.0   \n",
       "\n",
       "   NumberRealEstateLoansOrLines  NumberOfTime60-89DaysPastDueNotWorse  \\\n",
       "0                           6.0                                   0.0   \n",
       "1                           0.0                                   0.0   \n",
       "2                           0.0                                   0.0   \n",
       "3                           0.0                                   0.0   \n",
       "4                           1.0                                   0.0   \n",
       "\n",
       "   NumberOfDependents  \n",
       "0                 2.0  \n",
       "1                 1.0  \n",
       "2                 0.0  \n",
       "3                 0.0  \n",
       "4                 0.0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(data.data, columns=data.feature_names).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                           Frequency  Percentage\n",
      "Negative (Good Customers)     105299    0.932551\n",
      "Positive (Bad Customers)        7616    0.067449\n"
     ]
    }
   ],
   "source": [
    "# Class label\n",
    "target = pd.DataFrame(pd.Series(data.target).value_counts(), columns=('Frequency',))\n",
    "target['Percentage'] = target['Frequency'] / target['Frequency'].sum()\n",
    "target.index = ['Negative (Good Customers)', 'Positive (Bad Customers)']\n",
    "print(target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Full description of the dataset\n",
    "# print data.DESCR"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>RevolvingUtilizationOfUnsecuredLines</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>age</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NumberOfTime30-59DaysPastDueNotWorse</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>DebtRatio</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>MonthlyIncome</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NumberOfOpenCreditLinesAndLoans</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NumberOfTimes90DaysLate</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NumberRealEstateLoansOrLines</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>NumberOfTime60-89DaysPastDueNotWorse</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>NumberOfDependents</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                               Features\n",
       "0  RevolvingUtilizationOfUnsecuredLines\n",
       "1                                   age\n",
       "2  NumberOfTime30-59DaysPastDueNotWorse\n",
       "3                             DebtRatio\n",
       "4                         MonthlyIncome\n",
       "5       NumberOfOpenCreditLinesAndLoans\n",
       "6               NumberOfTimes90DaysLate\n",
       "7          NumberRealEstateLoansOrLines\n",
       "8  NumberOfTime60-89DaysPastDueNotWorse\n",
       "9                    NumberOfDependents"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Number of features\n",
    "pd.DataFrame(data.feature_names, columns=('Features',))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Credit scoring as a standard classification problem\n",
    "\n",
    "Using three classifiers, a model is learned to classify customers in good and bad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Load classifiers and split dataset in training and testing\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test, cost_mat_train, cost_mat_test = \\\n",
    "train_test_split(data.data, data.target, data.cost_mat)\n",
    "\n",
    "# Fit the classifiers using the training dataset\n",
    "classifiers = {\"RF\": {\"f\": RandomForestClassifier()},\n",
    "               \"DT\": {\"f\": DecisionTreeClassifier()},\n",
    "               \"LR\": {\"f\": LogisticRegression()}}\n",
    "\n",
    "for model in classifiers.keys():\n",
    "    # Fit\n",
    "    classifiers[model][\"f\"].fit(X_train, y_train)\n",
    "    # Predict\n",
    "    classifiers[model][\"c\"] = classifiers[model][\"f\"].predict(X_test)\n",
    "    classifiers[model][\"p\"] = classifiers[model][\"f\"].predict_proba(X_test)\n",
    "    classifiers[model][\"p_train\"] = classifiers[model][\"f\"].predict_proba(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "  After the classifier $c_i$ is estimated, there is a need to evaluate its performance. In \n",
    "  practice, many statistical evaluation measures are used to assess the performance of a credit \n",
    "  scoring model. Measures such as the area under the  receiver operating characteristic curve (AUC),\n",
    "  Brier score, Kolmogorov-Smirnoff (K-S) statistic,  $F_1$-Score, and misclassification are among \n",
    "  the most common [4]. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f1</th>\n",
       "      <th>pre</th>\n",
       "      <th>rec</th>\n",
       "      <th>acc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>RF</th>\n",
       "      <td>0.221516</td>\n",
       "      <td>0.484375</td>\n",
       "      <td>0.143592</td>\n",
       "      <td>0.930532</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DT</th>\n",
       "      <td>0.244554</td>\n",
       "      <td>0.235575</td>\n",
       "      <td>0.254246</td>\n",
       "      <td>0.891884</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LR</th>\n",
       "      <td>0.022189</td>\n",
       "      <td>0.550000</td>\n",
       "      <td>0.011323</td>\n",
       "      <td>0.931312</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          f1       pre       rec       acc\n",
       "RF  0.221516  0.484375  0.143592  0.930532\n",
       "DT  0.244554  0.235575  0.254246  0.891884\n",
       "LR  0.022189  0.550000  0.011323  0.931312"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Evaluate the performance\n",
    "from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score\n",
    "measures = {\"f1\": f1_score, \"pre\": precision_score, \n",
    "            \"rec\": recall_score, \"acc\": accuracy_score}\n",
    "results = pd.DataFrame(columns=measures.keys())\n",
    "\n",
    "# Evaluate each model in classifiers\n",
    "for model in classifiers.keys():\n",
    "    results.loc[model] = [measures[measure](y_test, classifiers[model][\"c\"]) for measure in measures.keys()]\n",
    "\n",
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAo0AAAEyCAYAAACf2epwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xl0m/d95/v3g5XEQpAECO6iSGqj\nJGulZFuOY8vSJE2apK6bTJfUznbT26bnOqdzM5M4k854TpvTTJtkpmlzZhLX0fh6elJP4iRtdleU\nbcVWbEuyJNvaJWrjIoKLBC4gieV57h/gKlECKZECCX5e5+hQALE8kPgjPvh+f7/fY1iWZSEiIiIi\nchO2bB+AiIiIiMx/Co0iIiIikpFCo4iIiIhkpNAoIiIiIhkpNIqIiIhIRgqNIiIiIpKRQqOIiIiI\nZKTQKCIiIiIZKTSKiIiISEYKjSIiIiKSkSObT97W1pbNp59ToVCIrq6ubB+GyKKjsSeSHbk+9ioq\nKrJ9CFmnSqOIiIiIZKTQKCIiIiIZKTSKiIiISEYKjSIiIiKSkUKjiIiIiGSk0CgiIiIiGSk0ioiI\niEhGWd2nUURERBa2kydPsm/fPvr6+vD7/Wzbto2VK1dm+7BkDig0zjINHhERWSxOnjxJU1MTyWQS\ngL6+PpqamgD03peDFBpn0Y0Gj2maNDQ0ZPnoREREbo1lWaRSKRKJxNifeDzO3r17x97zRiWTSfbt\n26fQmIMUGmfRvn37phw8//qv/0pTUxMulwun03nTPzO5jcPhwDCMLL1aERGZj0YDXjwenxTyJoa9\nG12+0X0SiQSmaU77GPr6+ubwFUq2KDTOopsNko0bN045CPv7+68brDNxKwHU5XLhcDhueBu73X67\n/xQiIjINlmWRTCZvGuxuJfxZljXtY5jqvcDj8UzrfWX37t3EYrHrHtPv98/mP5PMEwqNs8jv908Z\nHP1+P/fdd9+0HuNGv0Cm8ykwHo+TTCYZHh6eFEYTiQSpVGrar8Nms6kqKiJyjYm/n6f6XZzpuhv9\n/p5uwDMMY8rfsRMD3rW/l29WPJiN383333//pGlZAA6Hg23btt3yY8r8pdA4i7Zt23bbg2fiL4XZ\nlEqlSCaTNw2dmX6xZaMqmuk2qoqKyFQsy5pxdW46103XxN/lE393eb3eKX+XZQp7LpcLu90+7z58\nj85b1ALQxcGwZlLDnmVtbW3Zeuo5s5hWT99OVfRmt7mVqujN2u3Xfqqe60/ekl2hUIiurq5sH4bM\nwLUBbzrBbjpVvOkyDOOWg9yN7jMfA95cy/WxV1FRke1DyDpVGmfZypUrWblyZc4PHrhzVdGbVUhV\nFRW5s0YD3nQqdNMNfzMZnzabbcqx5vf7M34gvNHlxRjwRG6FQqPMO3a7HbvdjtvtnrXHnI2q6GzM\nFZ2N8Dl6/Wh1VW92ciOmac5Ke3bi5Wt3iLiZG82PzsvLu+Uqnj58iWSPQqMsCnNdFZ1JK+3ayulc\nV0Vv1pJXVXT+GA14t7JS9kb3m0nAs9vtU/5s5OfnT2vqx1SX9XMkklsUGkVug6qiM7vNXFZF7+R8\n4qkWlt3KPLyJl2fy/zMa8KbaJuVW5uYp4InIdCg0iswzc1UVnU6rcuL1U20tMpdV0VsNqHa7/aan\nMlu2bNktB7kb3WemAW+q1+T1eqc1DWGqyrECnohkg1ZPz5HFsBBGZKZnnpjubWZaFZ3JmSpuZnSe\n6M3m1N3suqm+b7PZZuXYROa7XH/f0+ppVRpF5DYYhoHD4cDhmN1fJTOpiiYSCQ4cOHDDx7r33nun\nXc1UwBMRuTGFRhGZd2w2G263e9pzRU+ePHnDszFt2bJltg9PRGRR0sdqEVnwtm3bdl21U6cyExGZ\nXao0isiCp1OZiYjMPYVGEckJi+lsTCIi2aD2tIiIiIhkpNAoIiIiIhkpNIqIiIhIRgqNIiIiIpKR\nQqOIiIiIZKTQKCIiIiIZKTSKiIiISEYKjSIiIiKSkUKjiIiIiGSk0CgiIiIiGSk0ioiIiEhGCo0i\nIiIikpFCo4iIiIhkpNAoIiIiIhkpNIqIiIhIRgqNIiIiIpKRYzo3Onz4MLt27cI0TXbs2MHDDz88\n6ftdXV1885vfZGBgANM0+YM/+AM2bdo0JwcsIiIiIndextBomiZPP/00X/rSlwgGgzzxxBM0NjZS\nVVU1dpvnn3+ee++9l/e85z20tLTwV3/1VwqNIiIiIjkkY3v6zJkzlJWVUVpaisPhYNu2bezfv3/S\nbQzDIBaLARCLxSgqKpqboxURERGRrMhYaezp6SEYDI5dDgaDnD59etJtPvKRj/CXf/mX/OIXv2B4\neJg///M/n/0jFREREZGsyRgaLcu67jrDMCZdfvXVV3nwwQf54Ac/yKlTp/i7v/s7vva1r2GzTS5k\n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\n39/PF7/4RY4cOQLA5z73OT74wQ9O+3kyhsZgMEh3d/fY5e7uboqKisYuDw0NcenSJf7Lf/kvAFy9\nepW//uu/5j/8h/+gxTAybSVeJ+9fUcT7VxQxmDA5cnl0NXY/r1zow2bAqlC6jb210kdlgUsVB5EF\nzLIsjncO0tQc5ZULfQwlTcr9Tj66PsT22gAlXme2D1FkRl588UUikcgNv9/e3k5q4omngWQyyS9/\n+UveeuutKe8TDofZvn17xuf+27/9W4qKihgcHOS9730vv/Ebv8G/+3f/jn/+53+mpqaGK1euAPD1\nr3+dgoICXn75ZSCd2WYiY2isr6+nvb2dSCRCcXEx+/bt4/HHHx/7vsfj4emnnx67/OSTT/Loo48q\nMMoty3fauKfazz3VfkzL4syE1djPHOrkmUOdlPmcYwFyddiDQ6uxRRaErliCF5uj7GmO0taXIM9h\ncN+SAnbUB1hdkq8Pg5Kzrg2Mma6fiaeeeoqf/exnQPrUhs8++yz33HMPNTU1AGPFvr179/Ltb397\n7H6FhYUzep6ModFut/PJT36SL3/5y5imyfbt26murua5556jvr6exsbGGT2hyEzYDIMVoXxWhPL5\n6PoSOgcSY+fG/sWpq/z4xBU8Thsby71srfKxqcKn/dlE5pl4yuS1S/00NUc50j6ABawN5/ORtSHu\nrfaT79TcZVn4MlUEv/3tb9PX13fd9X6/n9/93d+95ed99dVX2bt3Lz/72c/weDw8/PDDrFmzhjNn\nzlx326mmHM7EtJafbdq0iU2bNk267kYv8Mknn7ytAxK5mRKvk/etKOJ9K4oYSo60sVvSbexXL05o\nY1f6aKzyUa02tkhWWJbFmZ4hms5G2Xuhl4G4SYnHwUfWBnmoLqDz1suic//990+a0wjpxUP333//\nbT1ub28vhYWFeDweTp8+zcGDB4nH4/z617/mwoULY+3poqIiHnzwQb7zne/wl3/5l0C6PT2TaqNh\n3W7svA1tbW3Zeuo5l+sTgucb07I42zM0tpim+Up6wnyZz0njyKbia8Ie7ee2CGjsZdfVwSQvnY/S\ndDbKxWgcl93g3mo/D9UFWFfmwaYPcTkr18feVAthWltbcbmm/wFoLlZPDw8P87GPfYz29naWLVtG\nd3c3//7f/3uGhobGusShUIjvf//79Pf384UvfIG33noLm83G5z73OT7wgQ9Merx4PE5lZeWUz6XQ\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x267460b5518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the results\n",
    "%matplotlib inline\n",
    "from IPython.core.pylabtools import figsize\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('ggplot')\n",
    "\n",
    "figsize(10, 5)\n",
    "ax = plt.subplot(111)\n",
    "\n",
    "ind = np.arange(results.shape[0])\n",
    "width = 0.2\n",
    "l = ax.plot(ind, results, \"-o\")\n",
    "plt.legend(iter(l), results.columns.tolist(), loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "ax.set_xlim([-0.25, ind[-1]+.25])\n",
    "ax.set_xticks(ind)\n",
    "ax.set_xticklabels(results.index)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "  Nevertheless, none of these measures takes into account the \n",
    "  business and economical realities that take place in credit scoring. Costs that the financial \n",
    "  institution had incurred to acquire customers, or the expected profit due to a particular client, \n",
    "  are not considered in the evaluation of the different models. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Financial Evaluation of a Credit Scorecard\n",
    "\n",
    "  Typically, a credit risk model is evaluated using standard cost-insensitive measures.\n",
    "  However, in practice, the cost associated with approving \n",
    "  what is known as a bad customer, i.e., a customer who default his credit loan, is quite \n",
    "  different from the cost associated with declining a good customer,  i.e., a customer who \n",
    "  successfully repay his credit loan. Furthermore, the costs are not constant among customers. \n",
    "  This is because loans have different credit line amounts, terms, and even interest rates. Some \n",
    "  authors have proposed methods that include the misclassification costs in the credit scoring \n",
    "  context [4,5,6,7].\n",
    "  \n",
    "  In order to take into account the varying costs that each example carries, we proposed in \n",
    "  [8], a cost matrix with example-dependent misclassification costs as \n",
    "  given in the following table.\n",
    "  \n",
    "  \n",
    "|  \t| Actual Positive ($y_i=1$)  \t|  Actual Negative \t($y_i=0$)|\n",
    "|---\t|:-:\t|:-:\t|\n",
    "|   Predicted Positive ($c_i=1$)\t|   $C_{TP_i}=0$\t|  $C_{FP_i}=r_i+C^a_{FP}$ \t|\n",
    "|  Predicted Negative  ($c_i=0$) \t|   $C_{FN_i}=Cl_i \\cdot L_{gd}$\t| $C_{TN_i}=0$\t|\n",
    "  \n",
    "  First, we assume that the costs of a correct \n",
    "  classification, $C_{TP_i}$ and $C_{TN_i}$, are zero for every customer $i$. We define $C_{FN_i}$ \n",
    "  to be the losses if the customer $i$ defaults to be proportional to his credit line $Cl_i$. We \n",
    "  define the cost of a false positive per customer $C_{FP_i}$ as the sum of two real financial \n",
    "  costs $r_i$ and $C^a_{FP}$, where $r_i$ is the loss in profit by rejecting what would have been a \n",
    "  good customer. \n",
    "  \n",
    "  The profit per customer $r_i$ is calculated as the present value of the difference between the \n",
    "  financial institution gains and expenses, given the credit line $Cl_i$, the term $l_i$ and the \n",
    "  financial institution lending rate $int_{r_i}$ for customer $i$, and the financial institution \n",
    "  of cost funds $int_{cf}$.\n",
    "\n",
    "  $$  r_i= PV(A(Cl_i,int_{r_i},l_i),int_{cf},l_i)-Cl_i,$$\n",
    "  \n",
    "  with $A$ being the customer monthly payment and $PV$ the present value of the monthly payments,\n",
    "  which are calculated using the time value of money equations [9],\n",
    " \n",
    " $$ A(Cl_i,int_{r_i},l_i) =  Cl_i \\frac{int_{r_i}(1+int_{r_i})^{l_i}}{(1+int_{r_i})^{l_i}-1},$$\n",
    " \n",
    " $$ PV(A,int_{cf},l_i) = \\frac{A}{int_{cf}} \\left(1-\\frac{1}{(1+int_{cf})^{l_i}} \\right).$$\n",
    "      \n",
    "  The second term $C^a_{FP}$, is related to the assumption that the financial institution will not \n",
    "  keep the money of the declined customer idle. It will instead give a loan to an alternative \n",
    "  customer [10]. Since no further information is known about the alternative customer, \n",
    "  it is assumed to have an average credit line $\\overline{Cl}$ and an average profit $\\overline{r}$.\n",
    "  Given that, \n",
    "  \n",
    "  $$  C^a_{FP}=- \\overline{r} \\cdot \\pi_0+\\overline{Cl}\\cdot L_{gd} \\cdot \\pi_1,$$\n",
    "\n",
    "  in other words minus the profit of an average alternative customer plus the expected loss, \n",
    "  taking into account that the alternative customer will pay his debt with a probability equal to \n",
    "  the prior negative rate, and similarly will default with probability equal to the prior positive \n",
    "  rate.\n",
    "  \n",
    "  One key parameter of our model is the credit limit. There exists several strategies to calculate \n",
    "  the $Cl_i$ depending on the type of loans, the state of the economy, the current portfolio, \n",
    "  among others [1,9]. Nevertheless, given the lack of information \n",
    "  regarding the specific business environments of the considered datasets, we simply define \n",
    "  $Cl_i$ as\n",
    "\n",
    "$$      Cl_i = \\min \\bigg\\{ q \\cdot Inc_i, Cl_{max}, Cl_{max}(debt_i) \\bigg\\},$$\n",
    "  \n",
    "  where $Inc_i$ and $debt_i$ are the monthly income and debt ratio of the customer $i$, \n",
    "  respectively, $q$ is a parameter that defines the maximum $Cl_i$ in times $Inc_i$, and \n",
    "  $Cl_{max}$ the maximum overall credit line. Lastly, the maximum credit line given the current \n",
    "  debt is calculated as the maximum credit limit such that the current debt ratio plus the new \n",
    "  monthly payment does not surpass the customer monthly income. It is calculated as\n",
    " \n",
    " $$  Cl_{max}(debt_i)=PV\\left(Inc_i \\cdot P_{m}(debt_i),int_{r_i},l_i\\right),$$\n",
    "  and\n",
    "  $$ P_{m}(debt_i)=\\min \\left\\{ \\frac{A(q \\cdot Inc_i,int_{r_i},l_i)}{Inc_i},\\left(1-debt_i \\right) \\right\\}.$$\n",
    "  \n",
    "  \n",
    "### Financial savings\n",
    "\n",
    "  Let $\\mathcal{S}$ be a set of $N$ examples $i$, $N=\\vert S \\vert$, where each example is \n",
    "  represented by  the augmented feature vector \n",
    "  $\\mathbf{x}_i^*=[\\mathbf{x}_i, C_{TP_i},C_{FP_i},C_{FN_i},C_{TN_i}]$  \n",
    "  and labeled using the class   label $y_i   \\in \\{0,1\\}$. \n",
    "  A classifier $f$ which generates the   predicted label $c_i$ for each   element $i$ is trained  \n",
    "  using the set $\\mathcal{S}$. Then the cost of   using $f$ on $\\mathcal{S}$ is calculated by\n",
    "  \n",
    "  $$   Cost(f(\\mathcal{S})) = \\sum_{i=1}^N Cost(f(\\mathbf{x}_i^*)),$$\n",
    "  \n",
    "  where\n",
    "  \n",
    " $$   Cost(f(\\mathbf{x}_i^*)) = y_i(c_i C_{TP_i} + (1-c_i)C_{FN_i}) + (1-y_i)(c_i C_{FP_i} + (1-c_i)C_{TN_i}).$$\n",
    "  \n",
    "\n",
    "  However, the total cost may not be easy to interpret. We proposed an approach in [8], where the savings of using an algorithm  are defined as the cost of the algorithm versus the cost of using no algorithm at all.  To do that, the cost of the costless class is defined as \n",
    "  \n",
    "  $$  Cost_l(\\mathcal{S}) = \\min \\{Cost(f_0(\\mathcal{S})), Cost(f_1(\\mathcal{S}))\\},$$\n",
    "  \n",
    "  where \n",
    "  \n",
    "  $$  f_a(\\mathcal{S}) = \\mathbf{a}, \\text{ with } a\\in \\{0,1\\}.$$\n",
    "  \n",
    "\n",
    "  The cost improvement can be expressed as the cost savings as compared with $Cost_l(\\mathcal{S})$. \n",
    "  \n",
    "  $$    Savings(f(\\mathcal{S})) = \\frac{ Cost_l(\\mathcal{S}) - Cost(f(\\mathcal{S}))}   {Cost_l(\\mathcal{S})}.$$\n",
    "  \n",
    "\n",
    "\n",
    "  ### Parameters for the Kaggle Credit Database\n",
    "\n",
    " As this database contain information regarding the features, and more importantly about the income of each example, from which an estimated credit limit $Cl_i$ can be calculated.\n",
    "Since no specific information regarding the datasets is provided, we assume that they belong to  an\n",
    "average Portuguese financial institution. This enabled us to find the different \n",
    "parameters needed to calculate the cost measure. \n",
    "\n",
    "| Parameter \t| Value |\n",
    "|---\t|:-:\t|\n",
    "|Interest rate ($int_r$) | 4.79% |\n",
    "|  Cost of funds ($int_{cf}$) | 2.94% |\n",
    "|  Term ($l$) in months | 24 |\n",
    "|  Loss given default ($L_{gd}$) | 75% |\n",
    "|  Times income ($q$) | 3 |\n",
    "|  Maximum credit line ($Cl_{max}$) | 25,000|\n",
    "\n",
    "In particular, we obtain the average interest rates in Europe during   2013 from the European Central Bank [11]. Additionally, we use a fixed loan term $l$ to two years,\n",
    "considering that in the Kaggle Credit dataset the class was constructed to predict two years of credit behavior.\n",
    "Moreover, we set the loss given default $L_{gd}$ using information from \n",
    "the Basel II standard, $q$ to 3 since it is the average personal loan requests related to monthly income, and the maximum credit limit $Cl_{max}$ to 25,000 Euros.\n",
    "\n",
    "### Calculation of the savings of the models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  1023.73054104  18750.              0.              0.        ]\n",
      " [   717.25781516   6749.25            0.              0.        ]\n",
      " [   866.65393177  12599.25            0.              0.        ]]\n"
     ]
    }
   ],
   "source": [
    "# The cost matrix is already calculated for the dataset\n",
    "# cost_mat[C_FP,C_FN,C_TP,C_TN]\n",
    "print(data.cost_mat[[10, 17, 50]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          f1       pre       rec       acc       sav\n",
      "RF  0.221516  0.484375  0.143592  0.930532  0.126101\n",
      "DT  0.244554  0.235575  0.254246  0.891884  0.177077\n",
      "LR  0.022189  0.550000  0.011323  0.931312  0.005574\n"
     ]
    }
   ],
   "source": [
    "# Calculation of the cost and savings\n",
    "from costcla.metrics import savings_score, cost_loss \n",
    "\n",
    "# Evaluate the savings for each model\n",
    "results[\"sav\"] = np.zeros(results.shape[0])\n",
    "for model in classifiers.keys():\n",
    "    results[\"sav\"].loc[model] = savings_score(y_test, classifiers[model][\"c\"], cost_mat_test)\n",
    "\n",
    "# TODO: plot results\n",
    "print(results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nUk++V6G9dU1GxwECxtv/PKzHi0pV1eCRT1JVg0ePF5Xq7X8e7vOfFR0drezsbEVERHR6vqamRna7\nXdHR0ZIku92uoUOHSpL27t2r2bNna9q0aZo+fbr27dsnn8+nBx98UDk5OZo6dapeeuklSdKWLVt0\n3XXX6fbbb9fUqVMlSX/605901VVXKTc3V/fcc4/a2trOKjNnVAEA581qNmnB5BTd9fp+5W8q1Yqr\n0xUTfv5nU4BA96v3yr7yl7dPqhvlOe367uY2nx7dUqo3Puu+rA5PiNC/Xf7VNxpoampSbm6uJGnI\nkCF65plnzrjtmDFjlJiYqKysLE2ZMkUzZ87UVVddJUmaN2+e7rzzTs2cOVNNTU3yer167bXXtGvX\nLr399tuqra3VVVddpQkTJkiSPvzwQ73zzjsaOnSoPvvsM7388st67bXXZLPZtGDBAr3wwguaM2fO\nV2Y/FUUVANAnBkVatSgnRff/7YBWbCnTT6alymLmZgDAVzm9pPb0fG91N/R/JhaLRevWrdOHH36o\nTZs26Sc/+Yl27NihefPmqby8XDNnzuz4TEl6//33df3118tisSgpKUkTJkzQhx9+qJiYGF1yySUd\nZ2M3bdqkHTt26Morr5TUXp6dTudZ7QdFFQDQZ0Y5I/XDLLeeer9Cf9hZo+9lJhodCTBUT2c+f/Cn\nT1TV0HUN0aRomx6eMby/YnVhMpk0btw4jRs3TlOnTtWPf/xj3XHHHd1u6/OduURHRUV12m7OnDl6\n4IEHzjkX16gCAPrUlSPilJcRpz/9o1ZbPz9udBzAr31/nEvhls4jD+EWk74/zjVgGSoqKrRz586O\nx7t27VJqaqpiYmKUnJys//3f/5UkNTc3q7GxUdnZ2XrppZfU1tammpoabd26VZdcckmXz50yZYpe\nffVVVVdXS5IOHz6szz///KyycUYVANCnTCaT/u1Slw4cadajReVaPiNMqbHhRscC/NLJ2f19Pev/\nTMaPH6/jx4+rpaVFr7/+up5//nlFRUXpwQcfVEVFhcLDw+VwOLRs2TJJ0pNPPql7771XDz/8sGw2\nm37zm99o5syZ2r59u3Jzc2UymfRf//VfcrlcKikp6fSzRo0apcWLF+vGG2+U1+uVzWZTfn6+0tLS\nep3X5Puq87cGKSsrMzpCSHE6naqpqTE6BvxA223XGB0B58jy9CtGR+iiusGje17fr5hwi5ZdPVRR\n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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2674990bac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the results\n",
    "\n",
    "figsize(10, 5)\n",
    "ax = plt.subplot(111)\n",
    "l = ax.plot(ind, results[\"f1\"], \"-o\", label='F1Score', c='C1')\n",
    "b = ax.bar(ind, results['sav'], 0.6, label='Savings')\n",
    "plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "ax.set_xlim([-0.5, ind[-1]+.5])\n",
    "ax.set_xticks(ind)\n",
    "ax.set_xticklabels(results.index)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are significant differences in the \n",
    "results when evaluating a model using a  traditional cost-insensitive measure such as the \n",
    "accuracy or F1Score,  than when using the savings, leading to the conclusion of the \n",
    "importance of using the real practical financial costs of each context."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bayes minimum risk\n",
    "\n",
    "As these methods (RF, LR and DT) are not performing well we then move to use cost-sensitive methods. The first model we used is the Bayes minimum risk model (BMR) [8].\n",
    "As defined in [12], the BMR classifier is a decision model based on quantifying \n",
    "tradeoffs between various decisions using probabilities and the costs that accompany such decisions. \n",
    "This is done in a way that for each example the expected losses are minimized. In  what follows, we \n",
    "consider the probability estimates $\\hat p_i$ as known, regardless of the algorithm used to \n",
    "calculate them.  The risk that accompanies each decision is calculated using the cost matrix described above.\n",
    "In the specific framework of binary classification, the risk of predicting the example $i$ as negative is \n",
    "\n",
    "$$ R(c_i=0|\\mathbf{x}_i)=C_{TN_i}(1-\\hat p_i)+C_{FN_i} \\cdot \\hat p_i, $$\n",
    "and\n",
    "$$ R(c_i=1|\\mathbf{x}_i)=C_{TP_i} \\cdot \\hat p_i + C_{FP_i}(1- \\hat p_i), $$\n",
    "\n",
    "is the risk when predicting the example as positive, where $\\hat p_i$ is the estimated positive \n",
    "probability for example $i$. Subsequently, if \n",
    "\n",
    "$$  R(c_i=0|\\mathbf{x}_i) \\le R(c_i=1|\\mathbf{x}_i), $$\n",
    "\n",
    "then  the example $i$ is classified as negative. This means that the risk associated with the \n",
    "decision $c_i$ is lower than the risk associated with classifying it as positive. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f1</th>\n",
       "      <th>pre</th>\n",
       "      <th>rec</th>\n",
       "      <th>acc</th>\n",
       "      <th>sav</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>RF</th>\n",
       "      <td>0.221516</td>\n",
       "      <td>0.484375</td>\n",
       "      <td>0.143592</td>\n",
       "      <td>0.930532</td>\n",
       "      <td>0.126101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DT</th>\n",
       "      <td>0.244554</td>\n",
       "      <td>0.235575</td>\n",
       "      <td>0.254246</td>\n",
       "      <td>0.891884</td>\n",
       "      <td>0.177077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LR</th>\n",
       "      <td>0.022189</td>\n",
       "      <td>0.550000</td>\n",
       "      <td>0.011323</td>\n",
       "      <td>0.931312</td>\n",
       "      <td>0.005574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RF-BMR</th>\n",
       "      <td>0.277842</td>\n",
       "      <td>0.179456</td>\n",
       "      <td>0.615028</td>\n",
       "      <td>0.779943</td>\n",
       "      <td>0.399326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DT-BMR</th>\n",
       "      <td>0.130096</td>\n",
       "      <td>0.076634</td>\n",
       "      <td>0.430262</td>\n",
       "      <td>0.603953</td>\n",
       "      <td>0.077424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LR-BMR</th>\n",
       "      <td>0.170002</td>\n",
       "      <td>0.100082</td>\n",
       "      <td>0.564076</td>\n",
       "      <td>0.620886</td>\n",
       "      <td>0.188954</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              f1       pre       rec       acc       sav\n",
       "RF      0.221516  0.484375  0.143592  0.930532  0.126101\n",
       "DT      0.244554  0.235575  0.254246  0.891884  0.177077\n",
       "LR      0.022189  0.550000  0.011323  0.931312  0.005574\n",
       "RF-BMR  0.277842  0.179456  0.615028  0.779943  0.399326\n",
       "DT-BMR  0.130096  0.076634  0.430262  0.603953  0.077424\n",
       "LR-BMR  0.170002  0.100082  0.564076  0.620886  0.188954"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from costcla.models import BayesMinimumRiskClassifier\n",
    "ci_models = list(classifiers.keys())\n",
    "\n",
    "for model in ci_models:\n",
    "    classifiers[model+\"-BMR\"] = {\"f\": BayesMinimumRiskClassifier()}\n",
    "    # Fit\n",
    "    classifiers[model+\"-BMR\"][\"f\"].fit(y_test, classifiers[model][\"p\"])  \n",
    "    # Calibration must be made in a validation set\n",
    "    # Predict\n",
    "    classifiers[model+\"-BMR\"][\"c\"] = classifiers[model+\"-BMR\"][\"f\"].predict(classifiers[model][\"p\"], cost_mat_test)\n",
    "    # Evaluate\n",
    "    results.loc[model+\"-BMR\"] = 0\n",
    "    results.loc[model+\"-BMR\", measures.keys()] = \\\n",
    "    [measures[measure](y_test, classifiers[model+\"-BMR\"][\"c\"]) for measure in measures.keys()]\n",
    "    results[\"sav\"].loc[model+\"-BMR\"] = savings_score(y_test, classifiers[model+\"-BMR\"][\"c\"], cost_mat_test)\n",
    "    \n",
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqoAAAEyCAYAAAAyWPLZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3XtAVHXeBvBnbgwMAzjMwAzIIIrm\nXREplUpFSTN706023S3XstcudrV3VyOttNZeWru872ZuZWaWta9Wa7lWZnjJkkwUQc00ES/cB2aQ\n+2Vmzrx/YCSBgjDMOTM8n39yZs7lew4neOac30XmcrlcICIiIiKSGLnYBRARERERtYVBlYiIiIgk\niUGViIiIiCSJQZWIiIiIJIlBlYiIiIgkiUGViIiIiCSJQZWIiIiIJIlBlYiIiIgkiUGViIiIiCSJ\nQZWIiIiIJEkpdgFtKSwsFLuETjEYDCgrKxO7jB6F59zzeM49j+fc83jOPc9bz3lkZKTYJfg03lEl\nIiIiIkliUCUiIiIiSWJQJSIiIiJJYlAlIiIiIkliUCUiIiIiSWJQJSIiIiJJYlAlIiIiIknqUFDN\nysrCY489hkceeQSffvrpJZfbt28f7rjjDpw6dar5vc2bN+ORRx7BY489hqysrK5XTEREREQ9QrtB\nVRAErF27Fk899RReffVV7N27F/n5+a2Wq6urw5dffokBAwY0v5efn4/09HS88sorWLJkCdauXQtB\nENx7BERERETkk9oNqjk5OTCZTDAajVAqlUhMTERGRkar5TZu3IhbbrkFKpWq+b2MjAwkJiZCpVIh\nPDwcJpMJOTk57j0CIiIiIvJJ7QZVm80GvV7f/Fqv18Nms7VY5vTp0ygrK8Po0aMvu25oaGirdYmI\niIiI2qJsbwGXy9XqPZlM1vxvQRCwfv16LFiwoEPrtiUtLQ1paWkAgNTUVBgMhg6tJzVKpdJra/dW\nPOeex3MOlPwu0bP78+jeAOPmdA/vUXp4nXsezzm1pd2gqtfrYbVam19brVbodLrm1/X19cjLy8Py\n5csBAOfPn8ff/vY3LFq0qNW6NpsNoaGhrfaRnJyM5OTk5tdlZWWdOxqRGQwGr63dW/Gcex7Pue/j\nz5fXuRi89ZxHRkaKXYJPazeoxsbGoqioCBaLBaGhoUhPT8ejjz7a/LlGo8HatWubXy9btgxz5sxB\nbGws/Pz88Pe//x0333wzysvLUVRUhP79+3fPkRARERGRT2k3qCoUCsybNw8rVqyAIAhISkqC2WzG\nxo0bERsbi4SEhEuuazabMW7cODzxxBOQy+W49957IZdz6FYiIiIiap/M1dGGpB5UWFgodgmd4q2P\nLbwZz7nn8ZwDzvm3iF1Ct1Ks2SJ2CaLjde553nrO+ei/e/H2JhERERFJEoMqEREREUkSgyoRERER\nSRKDKhERERFJEoMqEREREUkSgyoRERERSRKDKhERERFJEoMqEREREUkSgyoRERERSRKDKhERERFJ\nEoMqEREREUkSgyoRERERSRKDKhERERFJEoMqEREREUkSgyoRERERSRKDKhERERFJEoMqEREREUkS\ngyoRERERSRKDKhERERFJEoMqEREREUkSgyoRERERSRKDKhERERFJEoMqEREREUkSgyoRERERSZKy\nIwtlZWVh3bp1EAQBkydPxsyZM1t8vn37dnz11VeQy+Xw9/fH/fffj6ioKFgsFixcuBCRkZEAgAED\nBuC+++5z/1EQERERkc9pN6gKgoC1a9di6dKl0Ov1SElJQUJCAqKiopqXue666zBlyhQAwIEDB7B+\n/XosWbIEAGAymbBy5cpuKp+IiIiIfFW7j/5zcnJgMplgNBqhVCqRmJiIjIyMFstoNJrmf9fX10Mm\nk7m/UiIiIiLqUdq9o2qz2aDX65tf6/V6nDx5stVy27Ztw+effw6Hw4Fnnnmm+X2LxYJFixYhICAA\ns2fPxuDBg1utm5aWhrS0NABAamoqDAZDpw5GbEql0mtr91Y8557Hcw6UiF1AN+vpP1+A17kYeM6p\nLe0GVZfL1eq9tu6Y3njjjbjxxhvx3Xff4ZNPPsHDDz8MnU6H1atXIygoCLm5uVi5ciVefvnlFndg\nASA5ORnJycnNr8vKyjpzLKIzGAxeW7u34jn3PJ5z38efL69zMXjrOf+lHw51j3Yf/ev1elit1ubX\nVqsVOp3ukstf3DRApVIhKCgIANCvXz8YjUYUFRV1tWYiIiIi6gHaDaqxsbEoKiqCxWKBw+FAeno6\nEhISWixzcfjMzMxEREQEAKCyshKCIAAASkpKUFRUBKPR6M76iYiIiMhHtfvoX6FQYN68eVixYgUE\nQUBSUhLMZjM2btyI2NhYJCQkYNu2bThy5AgUCgW0Wi0eeughAMCxY8ewadMmKBQKyOVyzJ8/H1qt\nttsPioiIiIi8n8zVViNUkRUWFopdQqd4a/sab8Zz7nk854Bz/i1il9CtFGu2iF2C6Hide563nnO2\nUe1enJmKiIiIiCSJQZWIiIiIJIlBlYiIiIgkiUGViIiIiCSJQZWIiIiIJIlBlYiIiIgkiUGViIiI\niCSJQZWIiIiIJIlBlYiIiIgkiUGViIiIiCSJQZWIiIiIJIlBlYiIiIgkiUGViIiIiCSJQZWIiIiI\nJIlBlYiIiIgkiUGViIiIiCSJQZWIiIiIJIlBlYiIiIgkiUGViIiIiCSJQZWIiIiIJIlBlYiIiIgk\niUGViIiIiCSJQZWIiIiIJEnZkYWysrKwbt06CIKAyZMnY+bMmS0+3759O7766ivI5XL4+/vj/vvv\nR1RUFABg8+bN2LlzJ+RyOe655x7ExcW5/yiIiIiIyOe0G1QFQcDatWuxdOlS6PV6pKSkICEhoTmI\nAsB1112HKVOmAAAOHDiA9evXY8mSJcjPz0d6ejpeeeUVlJeX4/nnn8f//u//Qi7njVwiIiIiurx2\nE2NOTg5MJhOMRiOUSiUSExORkZHRYhmNRtP87/r6eshkMgBARkYGEhMToVKpEB4eDpPJhJycHDcf\nAhERERH5onbvqNpsNuj1+ubXer0eJ0+ebLXctm3b8Pnnn8PhcOCZZ55pXnfAgAHNy4SGhsJms7Va\nNy0tDWlpaQCA1NRUGAyGKz8SCVAqlV5bu7fiOfc8nnOgROwCullP//kCvM7FwHNObWk3qLpcrlbv\n/XLH9GI33ngjbrzxRnz33Xf45JNP8PDDD7e5bluSk5ORnJzc/LqsrKxD60mNwWDw2tq9Fc+55/Gc\n+z7+fHmdi8Fbz3lkZKTYJfi0dh/96/V6WK3W5tdWqxU6ne6Sy1/cNOC369psNoSGhnalXiIiIiLq\nIdoNqrGxsSgqKoLFYoHD4UB6ejoSEhJaLFNUVNT878zMTERERAAAEhISkJ6eDrvdDovFgqKiIvTv\n39/Nh0BEREREvqjdR/8KhQLz5s3DihUrIAgCkpKSYDabsXHjRsTGxiIhIQHbtm3DkSNHoFAooNVq\n8dBDDwEAzGYzxo0bhyeeeAJyuRz33nsve/wTERERUYfIXB1tSOpBhYWFYpfQKd7avsab8Zx7Hs85\n4Jx/i9gldCvFmi1ilyA6Xuee563nnG1UuxdvbxIRERGRJDGoEhEREZEkMagSERERkSQxqBIRERGR\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26749e32470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the results\n",
    "ind = np.arange(results.shape[0])\n",
    "figsize(10, 5)\n",
    "ax = plt.subplot(111)\n",
    "l = ax.plot(ind, results[\"f1\"], \"-o\", label='F1Score', c='C1')\n",
    "b = ax.bar(ind, results['sav'], 0.6, label='Savings')\n",
    "plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "ax.set_xlim([-0.5, ind[-1]+.5])\n",
    "ax.set_xticks(ind)\n",
    "ax.set_xticklabels(results.index)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cost-sensitive decision trees\n",
    "\n",
    "The next algorithm that is evaluated is the cost-sensitive decision trees algorithm [13].\n",
    "\n",
    "Decision trees are one of the most widely used machine learning algorithms [14]. \n",
    "The technique is considered to be white box, in the sense that is easy to interpret, and has a \n",
    "very low computational cost, while maintaining a good performance as compared with more complex \n",
    "techniques [15]. There are two types of decision tree depending on the objective of \n",
    "the model. They work either for classification or regression. \n",
    "\n",
    "- Construction of classification trees\n",
    "\n",
    "Classification trees is one of the most common types of decision tree, in which the objective \n",
    "is to find the $Tree$ that best discriminates between classes. In general the decision tree \n",
    "represents a set of splitting rules organized in levels in a flowchart structure.\n",
    "\n",
    "- Splitting criteria\n",
    "\n",
    "In the $Tree$, each rule is shown as a node, and it is represented as $(\\mathbf{x}^j,l^j)$, meaning \n",
    "that the set $\\mathcal{S}$ is split in two sets $\\mathcal{S}^l$ and $\\mathcal{S}^r$ according to \n",
    "$\\mathbf{x}^j$ and $l^j$:\n",
    "\n",
    "$$ \\mathcal{S}^l = \\{\\mathbf{x}_i^* \\vert \\mathbf{x}_i^* \\in \\mathcal{S} \\wedge x^j_i \\le l^j \\}, \\quad and \\quad\n",
    "  \\mathcal{S}^r = \\{\\mathbf{x}_i^* \\vert \\mathbf{x}_i^* \\in \\mathcal{S} \\wedge x^j_i > l^j \\}, $$\n",
    "\n",
    "where $\\mathbf{x}^j$ is the $j^{th}$ feature represented in the vector \n",
    "$\\mathbf{x}^j=[x_1^j,x_2^j,...,x_N^j]$, and $l^j$ is a value such that $min(\\mathbf{x}^j) \\le l^j < \n",
    "max(\\mathbf{x}^j)$. Moreover, $\\mathcal{S} = \\mathcal{S}^l \\cup \\mathcal{S}^r$.\n",
    "\n",
    "After the training set have been split, the percentage of positives in the different sets is calculated. First, the number of positives in each set is estimated by\n",
    "\n",
    "$$ \\mathcal{S}_1 = \\{\\mathbf{x}_i^* \\vert \\mathbf{x}_i^* \\in \\mathcal{S} \\wedge y_i =1 \\}, $$\n",
    "\n",
    "and the percentage of positives is calculates as $\\pi_1=\\vert \\mathcal{S}_1 \\vert / \\vert \\mathcal{S} \\vert.$\n",
    "\n",
    "Then, the impurity of each leaf is calculated using either a misclassification error, \n",
    "entropy or Gini measures:\n",
    "\n",
    "\n",
    "a) Misclassification: \n",
    "    $I_m(\\pi_1)=1-max(\\pi_1,1-\\pi_1)$ \n",
    "\n",
    "b) Entropy: $I_e(\\pi_1)=-\\pi_1\\log \\pi_1 -(1-\\pi_1) \\log (1-\\pi_1)$ \n",
    "\n",
    "c) Gini: \n",
    "    $I_g(\\pi_1)=2\\pi_1(1-\\pi_1)$\n",
    "\n",
    "Finally the gain of the splitting criteria using the rule $(\\mathbf{x}^j,l^j)$ is calculated as the \n",
    "impurity of $\\mathcal{S}$ minus the weighted impurity of each leaf:\n",
    "\n",
    "$$  Gain(\\mathbf{x}^j,l^j)=I(\\pi_1)-\\frac{\\vert \\mathcal{S}^l \\vert}{\\vert \\mathcal{S} \n",
    "\\vert}I(\\pi^l_1)  -\\frac{\\vert \\mathcal{S}^r \\vert}{\\vert \\mathcal{S} \\vert}I(\\pi^r_1), $$\n",
    "\n",
    "where $I(\\pi_1)$ can be either of the impurity measures $I_e(\\pi_1)$ or $I_g(\\pi_1)$.\n",
    "\n",
    "Subsequently, the gain of all possible splitting rules is calculated. The rule with maximal \n",
    "gain is selected\n",
    "\n",
    "$$  (best_x, best_l) = argmax_{(\\mathbf{x}^j,l^j)}Gain(\\mathbf{x}^j,l^j), $$\n",
    "\n",
    "and the set $\\mathcal{S}$ is split into $\\mathcal{S}^l$ and $\\mathcal{S}^r$ according to that rule. \n",
    "\n",
    "\n",
    "- Tree growing\n",
    "\n",
    "In order to grow a tree typical algorithms use a top-down induction using a greedy search in each\n",
    "iteration [16]. In each iteration, the algorithms evaluates all possible splitting \n",
    "rules and pick the one that maximizes the splitting criteria. After the selection of a splitting \n",
    "rule, each leaf is further selected and it is subdivides into smaller leafs, until one of the \n",
    "stopping criteria is meet. \n",
    "\n",
    "- Cost-sensitive impurity measures\n",
    "\n",
    "Standard impurity measures such as misclassification, entropy or Gini, take into account the \n",
    "distribution of classes of each leaf to evaluate the predictive power of a splitting rule,\n",
    "leading to an impurity measure that is based on minimizing the misclassification rate. However, \n",
    "as has been previously shown [8], minimizing misclassification does not \n",
    "lead to the same results than minimizing cost. Instead, we are interested in measuring how good \n",
    "is a splitting rule in terms of cost not only accuracy. For doing that, we propose a new \n",
    "example-dependent cost based impurity measure that takes into account the cost matrix of each \n",
    "example.\n",
    "\n",
    "We define a new cost-based impurity measure taking into account the costs when all the examples\n",
    "in a leaf are classified both as negative using $f_0$ and positive using $f_1$\n",
    "\n",
    "$$    I_c(\\mathcal{S}) = \\min \\bigg\\{ Cost(f_0(\\mathcal{S})), Cost(f_1(\\mathcal{S})) \\bigg\\}. $$\n",
    "\n",
    "The objective of this measure is to evaluate the lowest expected cost of a splitting rule.\n",
    "Following the same logic, the classification of each set is calculated as the prediction that \n",
    "leads to the lowest cost\n",
    "\n",
    "$$\n",
    "f(\\mathcal{S}) = \n",
    "\\begin{cases}\n",
    "  \\phantom{-}0 \\phantom{-} \\mbox{if} \\phantom{-} Cost(f_0(\\mathcal{S})) \\le \n",
    "Cost(f_1(\\mathcal{S}))\\\\\n",
    "  \\phantom{-}1 \\phantom{-}\\mbox{otherwise}\n",
    "\\end{cases}\n",
    "$$\n",
    "\n",
    "Finally, using the cost-based impurity, the splitting criteria cost based gain of using the \n",
    "splitting rule $(\\mathbf{x}^j,l^j)$ is calculated. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f1</th>\n",
       "      <th>pre</th>\n",
       "      <th>rec</th>\n",
       "      <th>acc</th>\n",
       "      <th>sav</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>RF</th>\n",
       "      <td>0.221516</td>\n",
       "      <td>0.484375</td>\n",
       "      <td>0.143592</td>\n",
       "      <td>0.930532</td>\n",
       "      <td>0.126101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DT</th>\n",
       "      <td>0.244554</td>\n",
       "      <td>0.235575</td>\n",
       "      <td>0.254246</td>\n",
       "      <td>0.891884</td>\n",
       "      <td>0.177077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LR</th>\n",
       "      <td>0.022189</td>\n",
       "      <td>0.550000</td>\n",
       "      <td>0.011323</td>\n",
       "      <td>0.931312</td>\n",
       "      <td>0.005574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RF-BMR</th>\n",
       "      <td>0.277842</td>\n",
       "      <td>0.179456</td>\n",
       "      <td>0.615028</td>\n",
       "      <td>0.779943</td>\n",
       "      <td>0.399326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DT-BMR</th>\n",
       "      <td>0.130096</td>\n",
       "      <td>0.076634</td>\n",
       "      <td>0.430262</td>\n",
       "      <td>0.603953</td>\n",
       "      <td>0.077424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LR-BMR</th>\n",
       "      <td>0.170002</td>\n",
       "      <td>0.100082</td>\n",
       "      <td>0.564076</td>\n",
       "      <td>0.620886</td>\n",
       "      <td>0.188954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CSDT</th>\n",
       "      <td>0.276488</td>\n",
       "      <td>0.167133</td>\n",
       "      <td>0.799794</td>\n",
       "      <td>0.711892</td>\n",
       "      <td>0.480551</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              f1       pre       rec       acc       sav\n",
       "RF      0.221516  0.484375  0.143592  0.930532  0.126101\n",
       "DT      0.244554  0.235575  0.254246  0.891884  0.177077\n",
       "LR      0.022189  0.550000  0.011323  0.931312  0.005574\n",
       "RF-BMR  0.277842  0.179456  0.615028  0.779943  0.399326\n",
       "DT-BMR  0.130096  0.076634  0.430262  0.603953  0.077424\n",
       "LR-BMR  0.170002  0.100082  0.564076  0.620886  0.188954\n",
       "CSDT    0.276488  0.167133  0.799794  0.711892  0.480551"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from costcla.models import CostSensitiveDecisionTreeClassifier\n",
    "\n",
    "classifiers[\"CSDT\"] = {\"f\": CostSensitiveDecisionTreeClassifier()}\n",
    "# Fit\n",
    "classifiers[\"CSDT\"][\"f\"].fit(X_train, y_train, cost_mat_train)\n",
    "# Predict\n",
    "classifiers[\"CSDT\"][\"c\"] = classifiers[\"CSDT\"][\"f\"].predict(X_test)\n",
    "# Evaluate\n",
    "results.loc[\"CSDT\"] = 0\n",
    "results.loc[\"CSDT\", measures.keys()] = \\\n",
    "[measures[measure](y_test, classifiers[\"CSDT\"][\"c\"]) for measure in measures.keys()]\n",
    "results[\"sav\"].loc[\"CSDT\"] = savings_score(y_test, classifiers[\"CSDT\"][\"c\"], cost_mat_test)\n",
    "    \n",
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqQAAAEyCAYAAAAskcJqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl4U2XePvD7ZOmStmlL0qYtLW0p\n+1pKgVKURTosgwIjjrgMOqAosoj4ExVHZ9D35R0GcFAERwcYRFwGFVkdEOuCYwtIkbIvLfuSLklb\nujdNcn5/tI3UFrsk6UnS+3NdXpLkJPnmadLeeb7nPEcQRVEEEREREZFEZFIXQERERETtGwMpERER\nEUmKgZSIiIiIJMVASkRERESSYiAlIiIiIkkxkBIRERGRpBhIiYiIiEhSDKREREREJClFczbKzMzE\nhg0bYLVaMXr0aEyePLne7d999x02bdqEDh06AADGjRuH0aNHO75aIiIiIvI4TQZSq9WK9evX4+WX\nX4ZGo8GiRYuQmJiIyMjIetslJyfjsccec1qhREREROSZmgyk2dnZCAsLg06nA1ATPA8dOtQgkLbG\njRs37H4MZ9FqtTAYDFKX4bY4fq3HsbMPx88+HD/7cPxaz9XHLiIiQuoSPFqTgbSgoAAajcZ2WaPR\nICsrq8F2Bw8exOnTpxEeHo5HH30UWq22wTapqalITU0FACxdurTRbVyFQqFw6fpcHcev9Th29uH4\n2YfjZx+OX+tx7Nq3JgOpKIoNrhMEod7lgQMHYtiwYVAqldi7dy/WrFmDv/zlLw3ul5KSgpSUFNtl\nV/4m5Orf1Fwdx6/1OHb24fjZh+NnH45f67n62HGG1LmaPMpeo9HAaDTaLhuNRgQHB9fbJiAgAEql\nEkBN6Lxw4YKDyyQiIiIiT9VkII2Li4Ner0deXh7MZjPS09ORmJhYb5vCwkLbvzMyMhyyfykRERER\ntQ9NtuzlcjlmzJiBJUuWwGq1YtSoUYiKisLmzZsRFxeHxMRE7N69GxkZGZDL5fD398fs2bPbonYi\nIiIi8gCC2NhOom2ER9l7Lo5f63Hs7MPxsw/Hzz4cv9Zz9bHjPqTOxTM1EREREZGkGEiJiIiISFIM\npEREREQkKQZSIiIiIpIUAykRERERSarJZZ+IiIiILDMnOvXxc5366IB87Q4nPwPZgzOkRERERCQp\nBlIiIiIikhQDKRERERFJioGUiIiIiCTFQEpEREREkmIgJSIiIiJJMZASERERkaQYSImIiIhIUgyk\nRERERCQpBlIiIiIikhQDKRERERFJioGUiIiIiCTFQEpEREREkmIgJSIiIiJJMZASERERkaQYSImI\niIhIUgykRERERCQpBlIiIiIikhQDKRERERFJioGUiIiIiCTFQEpEREREkmIgJSIiIiJJMZASERER\nkaQYSImIiIhIUgykRERERCQpBlIiIiIikhQDKRERERFJioGUiIiIiCTFQEpEREREkmIgJSIiIiJJ\nMZASERERkaQYSImIiIhIUgykRERERCQpBlIiIiIikhQDKRERERFJioGUiIiIiCTFQEpEREREkmIg\nJSIiIiJJMZASERERkaSaFUgzMzMxf/58zJs3D9u2bbvtdgcOHMD999+P8+fPO6xAIiIiIvJsTQZS\nq9WK9evX46WXXsLKlSuRlpaGa9euNdiuoqICu3fvRteuXZ1SKBERERF5piYDaXZ2NsLCwqDT6aBQ\nKJCcnIxDhw412G7z5s2YOHEilEqlUwolIiIiIs+kaGqDgoICaDQa22WNRoOsrKx621y8eBEGgwED\nBw7Ezp07b/tYqampSE1NBQAsXboUWq22tXU7nUKhcOn6XB3Hr/U4dvbh+NmH42cfTx6/XKkLsJOn\n/lw8RZOBVBTFBtcJgmD7t9VqxcaNGzF79uwmnywlJQUpKSm2ywaDobl1tjmtVuvS9bk6jl/refrY\nWWZOlLoEu8jX7pC6BKfy9Pefs3H8XJe9P5eIiAgHVUKNaTKQajQaGI1G22Wj0Yjg4GDb5crKSly9\nehWvvvoqAKCoqAjLli3D888/j7i4OCeUTERERESepMlAGhcXB71ej7y8PHTo0AHp6el4+umnbber\nVCqsX7/ednnx4sWYNm0awygRERERNUuTgVQul2PGjBlYsmQJrFYrRo0ahaioKGzevBlxcXFITExs\nizqJiIiIyEM1GUgBICEhAQkJCfWumzp1aqPbLl682O6iiIiIiKj94JmaiIiIiEhSDKREREREJCkG\nUiIiIiKSFAMpEREREUmKgZSIiIiIJMVASkRERESSYiAlIiIiIkkxkBIRERGRpBhIiYiIiEhSDKRE\nREREJCkGUiIiIiKSFAMpEREREUmKgZSIiIiIJMVASkRERESSYiAlIiIiIkkxkBIRERGRpBhIiYiI\n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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26749f14b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the results\n",
    "ind = np.arange(results.shape[0])\n",
    "figsize(10, 5)\n",
    "ax = plt.subplot(111)\n",
    "l = ax.plot(ind, results[\"f1\"], \"-o\", label='F1Score', c='C1')\n",
    "b = ax.bar(ind, results['sav'], 0.6, label='Savings')\n",
    "plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "ax.set_xlim([-0.5, ind[-1]+.5])\n",
    "ax.set_xticks(ind)\n",
    "ax.set_xticklabels(results.index)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Conclusions\n",
    "\n",
    "CostCla is a easy to use Python library for example-dependent cost-sensitive \n",
    "classification problems. It includes many example-dependent cost-sensitive algorithms. Since \n",
    "it is part of the scientific Python ecosystem, it can be easily integrated with other \n",
    "machine learning libraries. Future work includes adding more cost-sensitive databases and \n",
    "algorithms, and support for Python $\\ge$ 3.4. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## References\n",
    "1. Anderson, R. (2007). The Credit Scoring Toolkit : Theory and Practice for Retail Credit Risk Management and Decision Automation. Oxford University Press.\n",
    "2. Hand, D. J., & Henley, W. E. (1997). Statistical Classification Methods in Consumer Credit Scoring: A Review. Journal of the Royal Statstical Society. Series A (Statistics in Society), 160(3), 523–541.\n",
    "3. Correa Bahnsen, A., & Gonzalez Montoya, A. (2011). Evolutionary Algorithms for Selecting the Architecture of a MLP Neural Network: A Credit Scoring Case. In IEEE 11th International Conference on Data Mining Workshops (pp. 725–732). Ieee. http://doi.org/10.1109/ICDMW.2011.80\n",
    "4. Beling, P., Covaliu, Z., & Oliver, R. M. (2005). Optimal scoring cutoff policies and efficient frontiers. Journal of the Operational Research Society, 56(9), 1016–1029. http://doi.org/10.1057/palgrave.jors.2602021\n",
    "5. Verbraken, T., Bravo, C., Weber, R., & Baesens, B. (2014). Development and application of consumer credit scoring models using profit-based classification measures. European Journal of Operational Research, 238(2), 505–513. http://doi.org/10.1016/j.ejor.2014.04.001\n",
    "6.  Alejo, R., & Garc, V. (2013). Making Accurate Credit Risk Predictions with Cost-Sensitive MLP Neural Networks. In J. Casillas, F. J. Martínez-López, R. Vicari, & F. De la Prieta (Eds.), Advances in Intelligent Systems and Computing (Vol. 220, pp. 1–8). Heidelberg: Springer International Publishing. http://doi.org/10.1007/978-3-319-00569-0\n",
    "7.  Oliver, R., & Thomas, L. (2009). Optimal score cutoffs and pricing in regulatory capital in retail credit portfolios (No. CRR-09-01). Southampton. Retrieved from http://eprints.soton.ac.uk/71321/\n",
    "8.  Correa Bahnsen, A., Aouada, D., & Ottersten, B. (2014). Example-Dependent Cost-Sensitive Logistic Regression for Credit Scoring. In 2014 13th International Conference on Machine Learning and Applications (pp. 263–269). Detroit, USA: IEEE. http://doi.org/10.1109/ICMLA.2014.48\n",
    "9.  Lawrence, D., & Solomon, A. (2012). Managing a Consumer Lending Business. Solomon Lawrence Partners. \n",
    "10. Nayak, G. N., & Turvey, C. G. (1997). Credit Risk Assessment and the Opportunity Costs of Loan Misclassification. Canadian Journal of Agricultural Economics, 45(3), 285–299. http://doi.org/10.1111/j.1744-7976.1997.tb00209.x\n",
    "11. ECB. (2014). European Central Bank. Retrieved from http://www.ecb.europa.eu/stats\n",
    "12. Jayanta K., G., Mohan, D., & Tapas, S. (2006). Bayesian Inference and Decision Theory. In An Introduction to Bayesian Analysis (Vol. 13, pp. 26–63). Springer New York. http://doi.org/10.1007/978-0-387-35433-0_2\n",
    "13. Correa Bahnsen, A., Aouada, D., & Ottersten, B. (2015). Example-Dependent Cost-Sensitive Decision Trees. Expert Systems with Applications, in press. http://doi.org/10.1016/j.eswa.2015.04.042\n",
    "14. Maimon, L. R. O. (2008). Data Mining with Decision Trees: Theory and Applications. World Scientific Publishing Company.\n",
    "15. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction (2nd ed.). Stanford, CA: Springer.\n",
    "16. Rokach, L., & Maimon, O. (2010). Decision Trees. In L. Rokach & O. Maimon (Eds.), Data Mining and Knowledge Discovery Handbook (2nd ed., pp. 149–174). Springer US. http://doi.org/10.1007/978-0-387-09823-4_9\n",
    "17. \\citep{Rokach2009}\n",
    "18. \\citep{Zhou2012}\n",
    "19. \\citep{Louppe2012}\n",
    "20. Correa Bahnsen, A., Aouada, D., & Ottersten, B. (2015). Ensembles of Example-Dependent Cost-Sensitive Decision Trees. http://arxiv.org/abs/1505.04637"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
